PICから始めよう、遊ぼう、楽しもう、PICキットの構築
XC8による基本プログラム
PIC16F18326/346編
PICキットXC8基本プログラム
当局で実験等で使用したXC8プログラムの最低限のメインソースです。
毎度々記述が必要かつほぼ同じな初期設定類です。
これをリネームして目的のメインソースに仕上げていきます。
ソースファイルや記載分を変更する場合がありますので、最終更新日を確認して下さい
当局は基本的に「素人」ですので、XC8の解説が出来る程の技術的レベルにありません。
ただ、素人らしく1行に多くの文や式を詰め込まなければ、良くも悪くも第3者が見ても解り易いしデバッグもし易いのでは?
と言う事で、見臭いとは思いますが、極力複合文にはしないようにしています。
また、ソースファイルになるべく多くのコメントを記していきますので、それを参照して下さい。
XC8では内部モジュール等の専用関数は用意されて無い様で、基本的に自分で用意しなければなりません。
それら専用関数は外部に置いたり、内部展開したりしますので、それらをインクルード、あるいはコピペして使用していきます。
このページでは内部展開する関数等も記載していきたいと思います。
MPLAB X IDEの起動、新規プロジェクト作成等は別項「PICキット・スタートマニュアル」を参照願います。
間違いや改良点や追加関数等がありましたら、その都度追加・修正していきます。
参考文献
MPLAB_XIDE ユーザーズガイド日本語版 (DS50002027D_JP)
MPLAB_XC8 入門ガイド日本語版 (DS50002173A_JP)
PIC16F18326/18346について JA0QONホームページ
最終更新日 2019年12月01日
当局で実験等で使用したXC8プログラムの最低限のメインソースです。
毎度々記述が必要かつほぼ同じな初期設定類です。
これをリネームして目的のメインソースに仕上げていきます。
ソースファイルや記載分を変更する場合がありますので、最終更新日を確認して下さい
当局は基本的に「素人」ですので、XC8の解説が出来る程の技術的レベルにありません。
ただ、素人らしく1行に多くの文や式を詰め込まなければ、良くも悪くも第3者が見ても解り易いしデバッグもし易いのでは?
と言う事で、見臭いとは思いますが、極力複合文にはしないようにしています。
また、ソースファイルになるべく多くのコメントを記していきますので、それを参照して下さい。
XC8では内部モジュール等の専用関数は用意されて無い様で、基本的に自分で用意しなければなりません。
それら専用関数は外部に置いたり、内部展開したりしますので、それらをインクルード、あるいはコピペして使用していきます。
このページでは内部展開する関数等も記載していきたいと思います。
MPLAB X IDEの起動、新規プロジェクト作成等は別項「PICキット・スタートマニュアル」を参照願います。
間違いや改良点や追加関数等がありましたら、その都度追加・修正していきます。
参考文献
MPLAB_XIDE ユーザーズガイド日本語版 (DS50002027D_JP)
MPLAB_XC8 入門ガイド日本語版 (DS50002173A_JP)
PIC16F18326/18346について JA0QONホームページ
最終更新日 2019年12月01日
↑ NO-14 LCDモジュール
AQM1602と互換性のある、
I2C接続16桁2行LCD
基本プログラム その1
メインソースファイル
XC8_16F18326BASIC_AQM01.c
XC8_16F18346BASIC_AQM01.c
インクルード ファイル
MSSP02b.h
MSSP02b.c
AQM1602v2.h
AQM1602v2.c
PICキットXC8基本プログラム その1
16桁2行のLCDを標準ディスプレイとした場合
LCDはI2Cインターフェイスで接続するタイプを使用します。
AQM1602あるいは互換品を対象としています。
使用PICキットモジュール(基板)
NO-01 14ピンCPU基板(PIC16F18326を装着)
NO-12 I2C接続LCD表示器、あるいはNO-14LCD表示器
以上の2種のモジュールを使用します
もちろん、5V電源や配線コード類も必要です。
PICキットCPUモジュールとLCDとの接続
LCDへはI2Cバス線が2本、電源線が2本、計4本の接続線が必要です
※電源線のプラスマイナスは間違わないように注意して下さい
CPU基板側 LCD側
RC0 SCL線
RC1 SDA線
基本プログラム その1
左記のソースファイルを参照して下さい
16F18326と16F18346は、RC6-RC7、RB5-RB7の6ピンが増えています。
I/O初期設定時がその分少々違いますが、コンフィグレーション設定は同じです。
その他、内蔵モジュールとI/Oピンとの設定が違う場合もあります。
最低限の記述しかありませんが、これに必要な計算やI/Oアクセス関数等を追加記述し、LCDに表示すればPICプログラミング完成、と言う寸法です。
ソースファイルのコメント文もご参照下さい。
まずは、この基本プログラムでXC8上のキャストを含めた数値演算とprintf文の使い方を練習してみるのが良いのではと、当局はお勧めします。
printf文は多機能なので、まともに使おうとすると意外と面倒だったりします・・・
printf文使用の注意点としては、
①printf文記述直前にLCD表示アドレスが最左側にセットされていること
②改行は使えない事
③複雑な使い方をするとメモリを大量消費する事(無料版では)
④浮動小数点演算も絡めての表示は特にメモリ食いです。
アッセンブラで実数計算はつらいのですよね、それが解消されます。
とは言っても結構頻度の高いビット操作はアッセンブラの方が楽ですけど
16桁2行のLCDを標準ディスプレイとした場合
LCDはI2Cインターフェイスで接続するタイプを使用します。
AQM1602あるいは互換品を対象としています。
使用PICキットモジュール(基板)
NO-01 14ピンCPU基板(PIC16F18326を装着)
NO-12 I2C接続LCD表示器、あるいはNO-14LCD表示器
以上の2種のモジュールを使用します
もちろん、5V電源や配線コード類も必要です。
PICキットCPUモジュールとLCDとの接続
LCDへはI2Cバス線が2本、電源線が2本、計4本の接続線が必要です
※電源線のプラスマイナスは間違わないように注意して下さい
CPU基板側 LCD側
RC0 SCL線
RC1 SDA線
基本プログラム その1
左記のソースファイルを参照して下さい
16F18326と16F18346は、RC6-RC7、RB5-RB7の6ピンが増えています。
I/O初期設定時がその分少々違いますが、コンフィグレーション設定は同じです。
その他、内蔵モジュールとI/Oピンとの設定が違う場合もあります。
最低限の記述しかありませんが、これに必要な計算やI/Oアクセス関数等を追加記述し、LCDに表示すればPICプログラミング完成、と言う寸法です。
ソースファイルのコメント文もご参照下さい。
まずは、この基本プログラムでXC8上のキャストを含めた数値演算とprintf文の使い方を練習してみるのが良いのではと、当局はお勧めします。
printf文は多機能なので、まともに使おうとすると意外と面倒だったりします・・・
printf文使用の注意点としては、
①printf文記述直前にLCD表示アドレスが最左側にセットされていること
②改行は使えない事
③複雑な使い方をするとメモリを大量消費する事(無料版では)
④浮動小数点演算も絡めての表示は特にメモリ食いです。
アッセンブラで実数計算はつらいのですよね、それが解消されます。
とは言っても結構頻度の高いビット操作はアッセンブラの方が楽ですけど
↑ 14ピンCPU基板
PIC16F18326装着
↑ 8桁7セグLEDモジュール
SPI接続の7セグLED
基本プログラム
XC8_16F18326BASIC_DFR01.c
XC8_16F18346BASIC_DFR01.c
インクルードファイル
DFR0090v2b.h
DFR0090v2b.c
PICキットXC8基本プログラム その2
8桁7セグLEDを標準ディスプレイとした場合
これはSPIで接続するタイプで、HC595を介してLEDと接続された構造となっています。
DFR0090あるいは互換品を対象としています。
今の所、制御LED数は8個までです。
制御可能LED桁数の拡張は可能ですが、必要性が出てきたら行いたいと思います。
MSSPは使用せず、データを受けませんので、送信しっぱなしです。
使用ポートが違うので、I2Cバスと共存できます。
また、送信のみなので、SPIポートとICSPポートと併用可能です。
LCDと違い、文字も大きく自ら発光するので、とても見易いです。
また、高速で動作するので、8bitPICでは理論的にはウエイト不要です。
使用PICキットモジュール(基板)
NO-01 14ピンCPU基板(PIC16F18326を装着)
DFR00908桁7セグLEDモジュール
以上の2種のモジュールを使用します
もちろん、5V電源や配線コード類も必要です。
PICキットCPUモジュールとLEDモジュールとの接続
LEDへはSPIバス線が3本、電源線が2本、計5本の接続線が必要です
※電源線のプラスマイナスは間違わないように注意して下さい
デフォルト設定(ヘッダーファイルで変更可)
CPU基板側 LED側
RA0 DATA線
RA1 LATCH線
RA2 CLOCK線
基本プログラム その1
XC8_16F18326BASIC_DFR01
printf文使用の注意点としては、
①printf文記述直前にLCD表示アドレスが最左側にセットされていること
②表示できる文字種に制限がある事
基本的に数字の使用を想定していますが、その他に少々の文字
③複雑な使い方をするとメモリを大量消費する事(有料版では改善されるのかも)
④浮動小数点演算も絡めての表示は特にメモリ食いです。
8桁7セグLEDを標準ディスプレイとした場合
これはSPIで接続するタイプで、HC595を介してLEDと接続された構造となっています。
DFR0090あるいは互換品を対象としています。
今の所、制御LED数は8個までです。
制御可能LED桁数の拡張は可能ですが、必要性が出てきたら行いたいと思います。
MSSPは使用せず、データを受けませんので、送信しっぱなしです。
使用ポートが違うので、I2Cバスと共存できます。
また、送信のみなので、SPIポートとICSPポートと併用可能です。
LCDと違い、文字も大きく自ら発光するので、とても見易いです。
また、高速で動作するので、8bitPICでは理論的にはウエイト不要です。
使用PICキットモジュール(基板)
NO-01 14ピンCPU基板(PIC16F18326を装着)
DFR00908桁7セグLEDモジュール
以上の2種のモジュールを使用します
もちろん、5V電源や配線コード類も必要です。
PICキットCPUモジュールとLEDモジュールとの接続
LEDへはSPIバス線が3本、電源線が2本、計5本の接続線が必要です
※電源線のプラスマイナスは間違わないように注意して下さい
デフォルト設定(ヘッダーファイルで変更可)
CPU基板側 LED側
RA0 DATA線
RA1 LATCH線
RA2 CLOCK線
基本プログラム その1
XC8_16F18326BASIC_DFR01
printf文使用の注意点としては、
①printf文記述直前にLCD表示アドレスが最左側にセットされていること
②表示できる文字種に制限がある事
基本的に数字の使用を想定していますが、その他に少々の文字
③複雑な使い方をするとメモリを大量消費する事(有料版では改善されるのかも)
④浮動小数点演算も絡めての表示は特にメモリ食いです。
↑ ADC出力値表示
関数からの出力値(HEX)を表示
ボリウムを回すと、出力値は、
0000H~03FFHまで変化する
画像の場合、15AH=346なので、
入力電圧は約1689mVとなる
↑ ADC出力値表示
PIC16F18346使用
ボリウム最大なので5V入力
ADCを使用した簡単なメイン関数、
内部展開しているADC関数
16F18346でもそのまま使えます
①PIC16F18326とLCD
XC8_16F18326BASIC_ADC01.c
②PIC16F18346と7セグLED
XC8_16F18346BASIC_ADC01.c
このデモプログラムでは、
VREF+:VDD
VREF-:VSS
ADC入力:RC2
以上の設定にて行っています
10ビットADC関数
内部関数としてメイン関数の後にコピペ展開します。
また、関数名のプロトタイピングも必要です。
アナログ入力ポート番号は実際のI/Oポート番号との関係はPICによって違いがありますが、16F18326/18346では共通です
I/Oポート設定は、アナログ入力とします(TRISbit=1,ANSELbit=1)
プログラムは汎用性を持たせるために回りくどい事をしています。
状況に合わせて固定値設定を行う事でプログラムはすっきりします。
ADC関数の使用方法
INIT_ADC(unsigned char 引数)
内蔵ADCの初期設定を行います
ADCクロック(TAD)はシステム変数を参照して最小値に設定します
引数からFVRも設定します。
自動変換トリガの設定は行いません
引数:電圧リファレンスの指定
0:VREF+=VDD、VREF-=VSS
1:VREF+=FVR1V、VREF-=VSS
2:VREF+=FVR2V、VREF-=VSS
3:VREF+=FVR4V、VREF-=VSS
4:VREF+=VREF+ピン、VREF-=VSS
5:VREF+=VREF+ピン、VREF-=VREF-ピン
戻値:無し
unsigned int GET_ADC(引数)
内蔵10ビットADCを起動・相対電圧値を取得します
事前にINIT_ADC()関数を実行しておく必要があります。
取得した電圧値は符号無し16bitで返しますが、下位10bitが有効
リファレンス電圧値の1/1024が分解能となります
引数:アナログ入力チャンネル番号(注1)
戻値:符号無16bit整数 0000H~03FFH
注1)PIC16F18326アナログチャンネル番号とI/Oポート
チャンネル番号 アナログポート番号 I/Oポート
00: ANA0: RA0
01: ANA1: RA1
02: ANA2: RA2
03: - 接続無し
04: ANA4: RA4
05: ANA5: RA5
06:~11: 接続無し
12: ANB4: RB4(注2)
13: ANB5: RB5(注2)
14: ANB6: RB6(注2)
15: ANB7: RB7(注2)
16: ANC0: RC0
17: ANC1: RC1
18: ANC2: RC2
19: ANC3: RC3
20: ANC4: RC4
21: ANC5: RC5
22: ANC6: RC6(注2)
23: ANC7: RC7(注2)
これ以上のチャンネルは各種内蔵モジュールとの接続になります。
注2)
PIC16F18346のみ
内部関数としてメイン関数の後にコピペ展開します。
また、関数名のプロトタイピングも必要です。
アナログ入力ポート番号は実際のI/Oポート番号との関係はPICによって違いがありますが、16F18326/18346では共通です
I/Oポート設定は、アナログ入力とします(TRISbit=1,ANSELbit=1)
プログラムは汎用性を持たせるために回りくどい事をしています。
状況に合わせて固定値設定を行う事でプログラムはすっきりします。
ADC関数の使用方法
INIT_ADC(unsigned char 引数)
内蔵ADCの初期設定を行います
ADCクロック(TAD)はシステム変数を参照して最小値に設定します
引数からFVRも設定します。
自動変換トリガの設定は行いません
引数:電圧リファレンスの指定
0:VREF+=VDD、VREF-=VSS
1:VREF+=FVR1V、VREF-=VSS
2:VREF+=FVR2V、VREF-=VSS
3:VREF+=FVR4V、VREF-=VSS
4:VREF+=VREF+ピン、VREF-=VSS
5:VREF+=VREF+ピン、VREF-=VREF-ピン
戻値:無し
unsigned int GET_ADC(引数)
内蔵10ビットADCを起動・相対電圧値を取得します
事前にINIT_ADC()関数を実行しておく必要があります。
取得した電圧値は符号無し16bitで返しますが、下位10bitが有効
リファレンス電圧値の1/1024が分解能となります
引数:アナログ入力チャンネル番号(注1)
戻値:符号無16bit整数 0000H~03FFH
注1)PIC16F18326アナログチャンネル番号とI/Oポート
チャンネル番号 アナログポート番号 I/Oポート
00: ANA0: RA0
01: ANA1: RA1
02: ANA2: RA2
03: - 接続無し
04: ANA4: RA4
05: ANA5: RA5
06:~11: 接続無し
12: ANB4: RB4(注2)
13: ANB5: RB5(注2)
14: ANB6: RB6(注2)
15: ANB7: RB7(注2)
16: ANC0: RC0
17: ANC1: RC1
18: ANC2: RC2
19: ANC3: RC3
20: ANC4: RC4
21: ANC5: RC5
22: ANC6: RC6(注2)
23: ANC7: RC7(注2)
これ以上のチャンネルは各種内蔵モジュールとの接続になります。
注2)
PIC16F18346のみ